package com.tdam2011.grupo04;

import java.util.Date;

import com.tdam2011.grupo04.entidades.Accion;
import com.tdam2011.grupo04.entidades.EmailContacto;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Sql extends SQLiteOpenHelper{

	static final String dbName = "TDAM";
	
	static final String accionTable = "Accion";
	static final String colAccionID = "accionID";
	static final String colEstado = "estado";
	static final String colTipo = "tipo";
	static final String colFecha = "fecha";
	
	static final String mensajeWebTable = "MensajeWeb";
	static final String colMensajeWebID = "mensajeWebID";
	static final String colMensajeWebFecha = "fecha";
	static final String colMensajeWebUsuario = "usuario";
	static final String colMensajeWebUsuarioDestino = "usuarioDestino";
	static final String colMensajeWebContactoID = "contactoID";
	static final String colMensajeWebTipo = "tipo";
	static final String colMensajeWebMensaje = "mensaje";
	static final String colMensajeWebEstado = "estado";
	
	static final String usuariosContactoTable = "usuariosContacto";
	static final String colUsuariosContactoDuenio = "duenio";
	static final String colUsuariosContactoID = "idcontacto";
	static final String colUsuariosContactoUsuario = "usuario";
	
	static final String emailTable= "Email";
	static final String colEmailID= "emailID";
	static final String colEmailDestino= "emailDestino";
	static final String colEmailFecha= "emailFecha";
	
	static final String contactoAmigoTable= "ContactoAmigo";
	static final String colContactoAmigoID= "contactoAmigoID";
	static final String colContacto= "contactoID";
	static final String colAmigo= "amigoID";
	static final String colCuenta= "cuenta";
	static final String colPrivado= "privado";

	
	private final int MENSAJE_NO_LEIDO= 0;
	
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("CREATE TABLE " +accionTable+ " ("
				+colAccionID+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+colEstado+ " TEXT, " 
				+colTipo+ " TEXT, " 
				+colFecha+ " TEXT)");
		
		db.execSQL("CREATE TABLE " +mensajeWebTable+ " ("
				+colMensajeWebID+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+colMensajeWebFecha+ " TEXT, " 
				+colMensajeWebUsuario+ " TEXT, "
				+colMensajeWebUsuarioDestino+ " TEXT, "
				+colMensajeWebContactoID+ " TEXT, "
				+colMensajeWebTipo+ " TEXT, " 
				+colMensajeWebMensaje+ " TEXT, "
				+colMensajeWebEstado+ " TEXT)");
		
		db.execSQL("CREATE TABLE " + emailTable + "("
				+colEmailID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+colEmailDestino + " TEXT, "
				+colEmailFecha + " TEXT)");
		
		db.execSQL("CREATE TABLE " + contactoAmigoTable + "("
				+colContactoAmigoID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+colContacto + " TEXT, "
				+colCuenta + " TEXT, "
				+colPrivado + " BOOLEAN, "
				+colAmigo + " TEXT)");
		
		db.execSQL("CREATE TABLE " + usuariosContactoTable + "("
				+colUsuariosContactoDuenio + " TEXT, "
				+colUsuariosContactoID + " TEXT, "
				+colUsuariosContactoUsuario + " TEXT)");
	}
	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS "+accionTable);
		db.execSQL("DROP TABLE IF EXISTS "+mensajeWebTable);
		db.execSQL("DROP TABLE IF EXISTS "+emailTable);
		db.execSQL("DROP TABLE IF EXISTS "+contactoAmigoTable);
		db.execSQL("DROP TABLE IF EXISTS "+usuariosContactoTable);
		onCreate(db);
	}
	
	public Sql (Context context){
		super(context, dbName, null, 1);
	}
	
	
	public void addAccion(Accion accion)
	{
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv=new ContentValues();
		cv.put(colEstado, accion.getEstado());
		cv.put(colTipo, accion.getTipo());
		cv.put(colFecha, accion.getFecha());
		db.insert(accionTable, colAccionID, cv);
		db.close();
	}
	 
	public Cursor getAllAccion()
	{
		SQLiteDatabase db=this.getReadableDatabase();
		Cursor cur=db.rawQuery("SELECT "+colAccionID+" AS _id, "+colEstado+", "+colTipo+", "+colFecha+" from "+accionTable,new String [] {});
		return cur;
	}
	
	public void addMensajeWeb(String user, com.tdam2011.grupo04.entidades.Mensaje mensajeWeb, int tipo){
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv=new ContentValues();
		cv.put(colMensajeWebFecha, new Date().toString());
		cv.put(colMensajeWebUsuario, user);
		cv.put(colMensajeWebUsuarioDestino, mensajeWeb.getNombreContacto());
		cv.put(colMensajeWebContactoID, mensajeWeb.getIdContacto());
		cv.put(colMensajeWebTipo, tipo);
		cv.put(colMensajeWebMensaje, mensajeWeb.getCuerpoMensaje());
		cv.put(colMensajeWebEstado, MENSAJE_NO_LEIDO);
		db.insert(mensajeWebTable, colMensajeWebID, cv);
		db.close();
		if(mensajeWeb.getIdContacto() == 0) 
			agregarUsuario(user, mensajeWeb.getNombreContacto(), String.valueOf(mensajeWeb.getIdContacto()));		
	}
	
	private void agregarUsuario(String duenio, String usuario, String idContacto){
		if(esUsuario(duenio, usuario)) return;
		
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv=new ContentValues();
		cv.put(colUsuariosContactoDuenio, duenio);
		cv.put(colUsuariosContactoUsuario, usuario);
		cv.put(colUsuariosContactoID, idContacto);
		db.insert(usuariosContactoTable, null, cv);
		db.close();
	}
	
	private boolean esUsuario(String duenio, String usuario){
		SQLiteDatabase db=this.getReadableDatabase();
		String query= "SELECT * FROM " + usuariosContactoTable 
				+ " WHERE " + colUsuariosContactoDuenio + "='" + duenio + "'" 
				+ " and " + colUsuariosContactoUsuario + "='" + usuario + "'";
		Cursor cur=db.rawQuery(query, new String [] {});
		
		boolean res= (cur.getCount() > 0)? true : false;
		
		cur.close();
		db.close();
		return res;
	}
	
	public void updateMensajeWeb(String duenio, String usuario, String id){
		SQLiteDatabase db= this.getWritableDatabase();
		
		ContentValues cv= new ContentValues();
		cv.put(colMensajeWebContactoID, id);
		String condicion= colMensajeWebUsuarioDestino + "='" + usuario + "' and " + colMensajeWebUsuario + "='" + duenio + "'"; 
		db.update(mensajeWebTable, cv, condicion, null);
		
		db.close();
		
		updateUsuarios(duenio, usuario, id);
	}
	
	private void updateUsuarios(String duenio, String usuario, String id){
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv= new ContentValues();
		cv.put(colUsuariosContactoID, id);
		String condicion= colUsuariosContactoUsuario + "='" + usuario + "' and " + colUsuariosContactoDuenio + "='" + duenio + "'"; 
		db.update(usuariosContactoTable, cv, condicion, null);
		db.close();
	}
	
	public Cursor getUsers(String duenio){
		SQLiteDatabase db=this.getReadableDatabase();
		
		String query= "SELECT usuario, idContacto" 
				+ " from " + usuariosContactoTable
				+ " where " + colUsuariosContactoDuenio + "='" + duenio + "'";
		
		Cursor cur= db.rawQuery(query, new String [] {});
		return cur;
	}
	
	public Cursor getUsuario(String duenio, String id){
		SQLiteDatabase db=this.getReadableDatabase();
		
		String query= "SELECT " + colUsuariosContactoUsuario 
				+ " from " + usuariosContactoTable
				+ " where " + colUsuariosContactoID + "='" + id + "' and " + colUsuariosContactoDuenio + "='" + duenio + "'";
		
		Cursor cur= db.rawQuery(query, new String [] {});
		return cur;
	}
	
	public Cursor getAllMensajesWeb(String columns, String condicion){
		SQLiteDatabase db=this.getReadableDatabase();
		
		String query= "SELECT " + columns 
				+ " from " + mensajeWebTable 
				+ " where " + condicion; 
		
		Cursor cur=db.rawQuery(query, new String [] {});
		return cur;
	}
	
	public void eliminarMensajeWeb(int mensajeWebID){
		SQLiteDatabase db = this.getReadableDatabase();
		db.delete(mensajeWebTable, colMensajeWebID + "=" + mensajeWebID, null);
		db.close();
	}
	
	public void eliminarConversacionWeb(String duenio, String usuarioDestino){
		SQLiteDatabase db = this.getReadableDatabase();
		db.delete(mensajeWebTable, colMensajeWebUsuario + "='" + duenio + "'"
				+ " and " + colMensajeWebUsuarioDestino + "='" + usuarioDestino + "'", null);
		db.close();
	}
	
	public void addEmail(EmailContacto email){		
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv=new ContentValues();
		cv.put(colEmailDestino, email.getValue());
		cv.put(colEmailFecha, email.getFechaEnvio());
		db.insert(emailTable, colEmailID, cv);
		db.close();
	}
	
	public Cursor getAllEmail(){
		SQLiteDatabase db=this.getReadableDatabase();
		Cursor cur=db.rawQuery(
				"SELECT "+colEmailID+", "+colEmailDestino+", "+colEmailFecha+" from " +emailTable,
			new String [] {});
		//db.close();
		return cur;
	}
	
	public void eliminarEmails(){
		SQLiteDatabase db = this.getReadableDatabase();
		db.delete(emailTable, null, null);
		db.close();
	}
	
	public void addContactoAmigo(String contacto, String amigo, String cuenta, boolean privado){		
		SQLiteDatabase db= this.getWritableDatabase();
		ContentValues cv=new ContentValues();
		cv.put(colContacto, contacto);
		cv.put(colAmigo, amigo);
		cv.put(colCuenta, cuenta);
		cv.put(colPrivado, privado);
		db.insert(contactoAmigoTable, colContactoAmigoID, cv);
		db.close();
	}
	
	public Cursor getAllContactoAmigo(){
		SQLiteDatabase db=this.getReadableDatabase();
		Cursor cur=db.rawQuery(
				"SELECT "+colContactoAmigoID+", "+colContacto+", "+colAmigo+", "+colCuenta+" from " +contactoAmigoTable,
			new String [] {});
		return cur;
	}
	
	public Cursor getContactoAmigo(String contacto, String cuenta){
		SQLiteDatabase db=this.getReadableDatabase();
		
		Cursor cur=db.rawQuery(
				"SELECT "+colContactoAmigoID+", "+colContacto+", "+colAmigo+", "+colPrivado +" from " +contactoAmigoTable+" where "+colContacto+" = '"+contacto +"' AND "+colCuenta+" = '"+cuenta +"'",
			new String [] {});
		return cur;
	}
	
	public int deleteOneContactoAmigo(String contacto, String cuenta){
		SQLiteDatabase db=this.getReadableDatabase();
		int resultado = db.delete(contactoAmigoTable, colContacto +"='"+ contacto +"' and "+colCuenta+" = '"+cuenta+"'" , null);
		db.close();
		return resultado;
	}
}
